package com.atguigu.java1;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;

import org.junit.Test;

public class OtherStreamTest {

	/*
	 * 处理流之五：数据流 DataInputStream 和 DataOutputStream 
	 * 作用：用于读取或写出基本数据类型、String、字节数组
	 */
	@Test
	public void test4() {
		DataInputStream dis = null;
		try {
			dis = new DataInputStream(new FileInputStream("destData.dat"));
			
			String info = dis.readUTF();
			boolean flag = dis.readBoolean();
			long time = dis.readLong();
			
			System.out.println(info);
			System.out.println(flag);
			System.out.println(time);
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (dis != null) {
				try {
					dis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

	}

	@Test
	public void test3() {
		DataOutputStream dos = null;
		try { // 创建连接到指定文件的数据输出流对象
			dos = new DataOutputStream(new FileOutputStream("destData.dat"));
			dos.writeUTF("我爱北京天安门"); // 写UTF字符串
			dos.writeBoolean(false); // 写入布尔值
			dos.writeLong(1234567890L); // 写入长整数
			System.out.println("写文件成功!");
		} catch (IOException e) {
			e.printStackTrace();
		} finally { // 关闭流对象
			try {
				if (dos != null) {
					// 关闭过滤流时,会自动关闭它包装的底层节点流
					dos.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}

	/*
	 * 处理流之四：打印流 PrintStream PrintWriter
	 * 
	 */
	@Test
	public void test2() {
		PrintStream ps = null;
		try {
			FileOutputStream fos = new FileOutputStream(new File("D:\\IO\\text.txt"));
			// 创建打印输出流,设置为自动刷新模式(写入换行符或字节 '\n' 时都会刷新输出缓冲区)
			ps = new PrintStream(fos, true);
			if (ps != null) {// 把标准输出流(控制台输出)改成文件
				System.setOut(ps);
			}
			for (int i = 0; i <= 255; i++) { // 输出ASCII字符
				System.out.print((char) i);
				if (i % 50 == 0) { // 每50个数据一行
					System.out.println(); // 换行
				}
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			if (ps != null) {
				ps.close();
			}
		}

	}

	/*
	 * 处理流之三：标准的输入输出流 
	 * System.in:标准的输入流，默认是从键盘输入
	 * System.out:标准的输出流，默认从显示器输出
	 * 
	 * System.setIn()：重新设置输入位置 System.setOut():重新设置输出位置
	 * 
	 * 
	 * 从键盘输入字符串，要求将读取到的整行字符串转成大写输出。然后继续进行输入操作， 直至当输入“e”或者“exit”时，退出程序。
	 * 
	 * System.in ----->InputStreamReader ---> BufferedReader readLine()
	 */
	@Test
	public void test1() {
		System.out.println("请输入信息(退出输入e或exit):");
		// 把"标准"输入流(键盘输入)这个字节流包装成字符流,再包装成缓冲流
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String s = null;
		try {
			while ((s = br.readLine()) != null) { // 读取用户输入的一行数据 --> 阻塞程序
				if ("e".equalsIgnoreCase(s) || "exit".equalsIgnoreCase(s)) {
					System.out.println("安全退出!!");
					break;
				}
				// 将读取到的整行字符串转成大写输出
				System.out.println("-->:" + s.toUpperCase());
				System.out.println("继续输入信息");
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (br != null) {
					br.close(); // 关闭过滤流时,会自动关闭它包装的底层节点流
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}
}
